
// 该函数用于将 16位整型PCM音频数据 通过 Web Audio API 播放，实现从二进制音频数据到声卡输出的完整流程
export const playPCM16 = (pcm16Array, sampleRate = 44100) => {
    try{
        // 初始化 Web Audio API 的核心接口，管理音频处理图。
        // 兼容性处理：window.webkitAudioContext 用于旧版 WebKit 内核浏览器（如 Safari）
        // 创建 AudioContext
        const audioContext = new (window.AudioContext || window.webkitAudioContext)()

        // Web Audio API 仅接受 Float32Array 格式音频数据，取值范围为 [-1, 1]
        // 转换原理：
        // 16位有符号整数范围：-32768（0x8000）到 32767（0x7FFF）。
        // 归一化公式：float = int16 / 32768，将整数映射到浮点范围
        // 将 Int16Array 转成 Float32Array （Web Audio API 使用 Float32）
        let float32Array = new Float32Array(pcm16Array.length)
        for (let i = 0; i < pcm16Array.length; i++) {
            float32Array[i] = pcm16Array[i] / 32768 //Int16 转成 Float32
        }
        // 创建 AudioBuffer
        // 参数解析：
        //  1：声道数（单声道）。
        //  float32Array.length：音频帧数（每帧对应一个采样点）。
        //  sampleRate：采样率（默认 44100Hz，即 CD 音质）
        const audioBuffer = audioContext.createBuffer(1, float32Array.length, sampleRate) // 单声道
        // getChannelData(0)：获取第一个（唯一）声道的 Float32Array 视图。
        // set(float32Array)：将转换后的浮点数据复制到音频缓冲区中
        audioBuffer.getChannelData(0).set(float32Array) // 设置音频数据

        // 创建 AudioBufferSourceNode 并播放音频
        // createBufferSource()：创建音频源节点，用于管理缓冲区播放。
        // connect(audioContext.destination)：将音频源连接到输出设备（如扬声器）。
        // start()：立即开始播放，无延迟参数表示从第 0 帧开始
        const source = audioContext.createBufferSource()
        source.buffer = audioBuffer
        source.connect(audioContext.destination) // 连接扬声器
        source.start() // 播放
        return source
    }catch (e) {
        console.warn(e)
        return null
    }
}